home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy005 / lowlevel / trian3.asm < prev    next >
Encoding:
Assembly Source File  |  1997-08-13  |  11.2 KB  |  296 lines

  1. ;;; PROGRAMA en assembler para comprobar la subrutina de dibujado rápido
  2. ;;; de triangulos rellenos        -->   Navi / PhyMosys
  3. .MODEL SMALL
  4. .STACK
  5. .386
  6.  
  7. LOCALS @@
  8. w EQU WORD PTR
  9. b EQU BYTE PTR
  10.  
  11. .CODE
  12. INCLUDE GRFLIB.INC
  13.  
  14. Save1   DD      0
  15. kk dw 0
  16.  
  17. FillTriangle    PROC
  18.                 MOV     AX, DS:[BX+2]   ;  Pillamos y1
  19.                 CMP     AX, DS:[BX+6]
  20.                 JBE   @@Cont1           ;  y1<y2 ?
  21.                 XCHG    AX, DS:[BX+6]
  22.                 MOV     DX, DS:[BX+0]
  23.                 MOV     DS:[BX+2], AX
  24.                 XCHG    DX, DS:[BX+4]
  25.                 MOV     DS:[BX+0], DX   ;  Cambio realizado.
  26.  
  27.       @@Cont1:  MOV     AX, DS:[BX+2]   ;  y1
  28.                 CMP     AX, DS:[BX+10]
  29.                 JBE   @@Cont2           ;  y1<y3 ?
  30.                 XCHG    AX, DS:[BX+10]
  31.                 MOV     DX, DS:[BX+0]
  32.                 MOV     DS:[BX+2], AX
  33.                 XCHG    DX, DS:[BX+8]
  34.                 MOV     DS:[BX+0], DX   ;  Cambio realizado.
  35.  
  36.       @@Cont2:  MOV     AX, DS:[BX+6]   ;  y2
  37.                 CMP     AX, DS:[BX+10]
  38.                 JBE   @@Cont3           ;  y2<y3 ?
  39.                 XCHG    AX, DS:[BX+10]
  40.                 MOV     DX, DS:[BX+4]
  41.                 MOV     DS:[BX+6], AX
  42.                 XCHG    DX, DS:[BX+8]
  43.                 MOV     DS:[BX+4], DX   ;  Cambio realizado.
  44.  
  45.       @@Cont3:  MOV     BP, BX
  46.                 MOV     AX, 0A000h
  47.                 MOV     ES, AX          ;  Segmento de video de la VGA
  48.  
  49.         ;  Inicialización de variables.
  50.  
  51.                 MOVZX   EDI, w DS:[BP+2]
  52.                 MOV     EAX, EDI
  53.                 SHL     EDI, 6          ;  EDI * 64
  54.                 SHL     EAX, 8          ;  EAX * 256
  55.                 ADD     EDI, EAX        ;  EDI * 320
  56.                 MOVZX   EAX, w DS:[BP+0]
  57.                 ADD     EDI, EAX        ;  EDI -> y1 * 320 + x1
  58.                 SAL     EDI, 7          ;  Pasamos a punto fijo.
  59.  
  60.                 MOVZX   ESI, w DS:[BP+6]
  61.                 MOV     EAX, ESI
  62.                 SHL     ESI, 6          ;  EDI * 64
  63.                 SHL     EAX, 8          ;  EAX * 256
  64.                 ADD     ESI, EAX        ;  EDI -> y2 * 320
  65.                 SAL     ESI, 7          ;  Pasamos a punto fijo.
  66.  
  67.                 MOV     AX, w DS:[BP+0]
  68.                 SUB     AX, w DS:[BP+8] ;  AX = x1 - x3
  69.                 MOV     BX, w DS:[BP+2]
  70.                 SUB     BX, w DS:[BP+10];  BX = y1 - y3
  71.                 MOVSX   EAX, AX
  72.                 MOVSX   EBX, BX         ;  Solo el WORD de bajo.
  73.                 SAL     EAX, 7
  74.                 SAL     EBX, 7          ;  Pasamos a punto fijo.
  75.                 XOR     EDX, EDX
  76.                 OR      EAX, EAX
  77.                 JNS   @@Ok2             ;  El signo de EDX es muy importante.
  78.                 DEC     EDX
  79.          @@Ok2: SAL     EAX, 7          ;  Para hacer la división.
  80.                 IDIV    EBX             ;  En EAX el resultado.
  81.                 MOV     CS:[Save1], EAX ;  Para dentro de un ratito :)
  82.                 MOV     ECX, EAX        ;  Guardamos el resultado para después
  83.                 ADD     EAX, 320*128    ;  EAX = EAX + 320 (en fixed)
  84.                 MOV     EBX, EAX
  85.  
  86.                 PUSH    EBX
  87.                 MOV     AX, w DS:[BP+4]
  88.                 SUB     AX, w DS:[BP+0] ;  AX = x2 - x1
  89.                 MOV     BX, w DS:[BP+6]
  90.                 SUB     BX, w DS:[BP+2] ;  BX = y2 - y1
  91.                 MOVSX   EAX, AX
  92.                 MOVSX   EBX, BX         ;  Solo el WORD de bajo.
  93.                 SAL     EAX, 7
  94.                 SAL     EBX, 7          ;  Pasamos a punto fijo.
  95.                 XOR     EDX, EDX
  96.                 OR      EAX, EAX
  97.                 JNS   @@Ok3             ;  El signo de EDX es muy importante.
  98.                 DEC     EDX
  99.          @@Ok3: SAL     EAX, 7          ;  Para hacer la división.
  100.                 IDIV    EBX             ;  En EAX el resultado.
  101.                 SUB     EAX, ECX        ;  ECX lo habiamos calculado antes.
  102.                 JNS   @@Positivo        ;  Si el signo es (-) cambiarlo.
  103.                 NEG     EAX
  104.     @@Positivo: MOV     EDX, EAX        ;  Ya está calculado el EDX!
  105.                 POP     EBX
  106.  
  107.                 XOR     ECX, ECX        ; y el ECX :)
  108.                 MOV     AX, DS:[BP+4]
  109.                 STD                     ;  Hacia  la izquierda..
  110.                 CMP     AX, DS:[BP+0]   ;  x2>x1 ?
  111.                 JNA   @@Ok1
  112.                 CLD                     ;  A la derecha..
  113.  
  114.         ;  El primer bucle.
  115.  
  116.        @@Ok1:   MOV     AX, DS:[BP+12]  ;  Pillamos el color.
  117.      @@BucleW1: CMP     EDI, ESI
  118.                 JNB   @@FinBucle1       ;  Hasta que EDI>=ESI
  119.  
  120.                 PUSH    EDI             ;  Tenemos que guardar estos registros
  121.                 PUSH    ECX
  122.                 SHR     EDI, 7
  123.                 SHR     ECX, 7
  124.                 REP  STOSB              ;  Dibujamos 1 línea horizontal.
  125.                 POP     ECX
  126.                 POP     EDI
  127.  
  128.                 ADD     EDI, EBX        ;  Incrementamos valores
  129.                 ADD     ECX, EDX
  130.                 JMP   @@BucleW1
  131.         @@FinBucle1:
  132.  
  133.         ;  Re-inicialización de las variables.
  134.  
  135.                 MOVZX   ESI, w DS:[BP+10]
  136.                 MOV     EAX, ESI
  137.                 SHL     ESI, 6          ;  ESI * 64
  138.                 SAL     EAX, 8          ;  EAX * 256
  139.                 ADD     ESI, EAX        ;  ESI -> y3 * 320
  140.                 SAL     ESI, 7          ;  Pasamos a punto fijo.
  141.  
  142.                 PUSH    EBX
  143.                 MOV     AX, w DS:[BP+4]
  144.                 SUB     AX, w DS:[BP+8] ;  AX = x2 - x3
  145.                 MOV     BX, w DS:[BP+6]
  146.                 SUB     BX, w DS:[BP+10];  BX = y2 - y3
  147.                 MOVSX   EAX, AX
  148.                 MOVSX   EBX, BX         ;  Solo el WORD de bajo.
  149.                 SAL     EAX, 7
  150.                 SAL     EBX, 7          ;  Pasamos a punto fijo.
  151.                 XOR     EDX, EDX
  152.                 OR      EAX, EAX
  153.                 JNS   @@Ok4             ;  El signo de EDX es muy importante.
  154.                 DEC     EDX
  155.          @@Ok4: SAL     EAX, 7          ;  Para hacer la división.
  156.                 IDIV    EBX             ;  En EAX el resultado.
  157.                 SUB     EAX, CS:[Save1] ;  El 'save' lo habiamos calculado antes
  158.                 JNS   @@Positivo2       ;  Si el signo es (-) cambiarlo.
  159.                 NEG     EAX
  160.     @@Positivo2:MOV     EDX, EAX        ;  Ya está recalculado EDX!
  161.                 POP     EBX
  162.  
  163.         ;  El darrer bucle.
  164.  
  165.                 MOV     AX, DS:[BP+12]  ;  Pillamos el color.
  166.      @@BucleW2: CMP     EDI, ESI
  167.                 JNB   @@FinBucle2       ;  Hasta que EDI>=ESI
  168.  
  169.                 PUSH    EDI             ;  Tenemos que guardar estos registros
  170.                 PUSH    ECX
  171.                 SHR     EDI, 7
  172.                 SHR     ECX, 7
  173.                 REP  STOSB              ;  Dibujamos 1 línea horizontal.
  174.                 POP     ECX
  175.                 POP     EDI
  176.  
  177.                 ADD     EDI, EBX        ;  Incrementamos valores
  178.                 SUB     ECX, EDX
  179.                 JMP   @@BucleW2
  180.         @@FinBucle2:
  181.                 RET                     ;  Un bonito triangulo, no? :)
  182. FillTriangle    ENDP
  183.  
  184. Tri1    DW      130, 80, 100, 20, 40, 130, 4
  185. Tri2    DW      20, 60, 20, 30, 100, 40, 5
  186. Tri3    DW      310, 0, 170, 110, 190, 15, 6
  187.  
  188. MainTriang      PROC
  189.                 CALL    LiberaMEM
  190.                 XOR     EAX, EAX
  191.                 MOV     BX, 1
  192.                 InicGRAPH
  193.                 MOV     AX, CS
  194.                 MOV     DS, AX
  195.  
  196.           mov eax,40          ; 40*250=10000 triangulos
  197. velocidad:      push eax
  198.  
  199.                 mov cs:[kk],0
  200.    @@otro:      mov     ax, cs:[kk]
  201.                 mov     cs:[tri1+12], ax
  202.                 mov     cs:[tri2+12], ax
  203.                 mov     cs:[tri3+12], ax
  204.  
  205.                 MOV     BX, Offset Tri1 ;  El triangulo 1
  206.                 CALL    FillTriangle
  207.                 MOV     BX, CS:[Tri1+0]
  208.                 MOV     SI, CS:[Tri1+2] ; Inicio
  209.                 MOV     DX, CS:[Tri1+4]
  210.                 MOV     DI, CS:[Tri1+6] ; Fin
  211.                 MOV     CH, 2           ; Color
  212.                 XOR     AL, AL          ; VGA
  213.                 Linea
  214.                 MOV     BX, CS:[Tri1+4]
  215.                 MOV     SI, CS:[Tri1+6] ; Inicio
  216.                 MOV     DX, CS:[Tri1+8]
  217.                 MOV     DI, CS:[Tri1+10]; Fin
  218.                 MOV     CH, 2           ; Color
  219.                 XOR     AL, AL          ; VGA
  220.                 Linea
  221.                 MOV     BX, CS:[Tri1+8]
  222.                 MOV     SI, CS:[Tri1+10]; Inicio
  223.                 MOV     DX, CS:[Tri1+0]
  224.                 MOV     DI, CS:[Tri1+2] ; Fin
  225.                 MOV     CH, 2           ; Color
  226.                 XOR     AL, AL          ; VGA
  227.                 Linea
  228.  
  229.                 MOV     BX, Offset Tri2 ;  El triangulo 2
  230.                 CALL    FillTriangle
  231.                 MOV     BX, CS:[Tri2+0]
  232.                 MOV     SI, CS:[Tri2+2] ; Inicio
  233.                 MOV     DX, CS:[Tri2+4]
  234.                 MOV     DI, CS:[Tri2+6] ; Fin
  235.                 MOV     CH, 2           ; Color
  236.                 XOR     AL, AL          ; VGA
  237.                 Linea
  238.                 MOV     BX, CS:[Tri2+4]
  239.                 MOV     SI, CS:[Tri2+6] ; Inicio
  240.                 MOV     DX, CS:[Tri2+8]
  241.                 MOV     DI, CS:[Tri2+10]; Fin
  242.                 MOV     CH, 2           ; Color
  243.                 XOR     AL, AL          ; VGA
  244.                 Linea
  245.                 MOV     BX, CS:[Tri2+8]
  246.                 MOV     SI, CS:[Tri2+10]; Inicio
  247.                 MOV     DX, CS:[Tri2+0]
  248.                 MOV     DI, CS:[Tri2+2] ; Fin
  249.                 MOV     CH, 2           ; Color
  250.                 XOR     AL, AL          ; VGA
  251.                 Linea
  252.  
  253.                 MOV     BX, Offset Tri3 ;  El triangulo 3
  254.                 CALL    FillTriangle
  255.                 MOV     BX, CS:[Tri3+0]
  256.                 MOV     SI, CS:[Tri3+2] ; Inicio
  257.                 MOV     DX, CS:[Tri3+4]
  258.                 MOV     DI, CS:[Tri3+6] ; Fin
  259.                 MOV     CH, 2           ; Color
  260.                 XOR     AL, AL          ; VGA
  261.                 Linea
  262.                 MOV     BX, CS:[Tri3+4]
  263.                 MOV     SI, CS:[Tri3+6] ; Inicio
  264.                 MOV     DX, CS:[Tri3+8]
  265.                 MOV     DI, CS:[Tri3+10]; Fin
  266.                 MOV     CH, 2           ; Color
  267.                 XOR     AL, AL          ; VGA
  268.                 Linea
  269.                 MOV     BX, CS:[Tri3+8]
  270.                 MOV     SI, CS:[Tri3+10]; Inicio
  271.                 MOV     DX, CS:[Tri3+0]
  272.                 MOV     DI, CS:[Tri3+2] ; Fin
  273.                 MOV     CH, 2           ; Color
  274.                 XOR     AL, AL          ; VGA
  275.                 Linea
  276.  
  277.                 inc cs:[kk]
  278.                 cmp cs:[kk], 250
  279.                 jb  @@otro
  280.  
  281.                 pop eax
  282.                 dec eax
  283.                 jnz velocidad
  284.  
  285.         @@Espera:                       ;  Esperar un momento.
  286.                 IN      AL, 60h
  287.                 DEC     AL
  288.                 JNZ   @@Espera
  289.  
  290.                 EndGRAPH
  291.                 MOV     AX, 4C00h
  292.                 INT     21h             ;  Bye...
  293. MainTriang      ENDP
  294.                 END     MainTriang
  295.  
  296.